Web Development AtomicInteger: গাইড ও নোট

321

Atomics এবং AtomicInteger মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে atomic operations পরিচালনা করার জন্য ব্যবহৃত হয়। Atomics হল JavaScript-এর একটি API, যা SharedArrayBuffer এবং typed arrays এর উপর কাজ করে। অন্যদিকে, AtomicInteger একটি জাভা (Java) ক্লাস, যা java.util.concurrent.atomic প্যাকেজের অংশ এবং এটি বিশেষভাবে atomic integer operations পরিচালনা করার জন্য ব্যবহৃত হয়।


AtomicInteger কী?

AtomicInteger হল Java-এর একটি ক্লাস যা একটি পূর্ণসংখ্যা (integer) এর মান পরিচালনা করতে atomic অপারেশন প্রদান করে। এটি থ্রেড-সেফ অপারেশন নিশ্চিত করে, অর্থাৎ, একাধিক থ্রেড একই AtomicInteger অবজেক্টের উপর একসঙ্গে কাজ করলেও কোনো ডেটা দুর্নীতি হবে না। এটি মূলত লক-মুক্ত (lock-free) synchronization প্রদান করে।


AtomicInteger এর বৈশিষ্ট্য

  • Thread-safe Increment/Decrement: ভ্যারিয়েবলের মান বাড়ানো বা কমানোর জন্য থ্রেড-সেফ অপারেশন।
  • Lock-free: কোনো লক বা মিউটেক্স ছাড়াই ডেটা পরিবর্তন নিশ্চিত করে।
  • Non-blocking Operations: থ্রেডগুলো একসঙ্গে কাজ করলেও এটি কার্যকরভাবে কাজ করে।
  • Atomicity: সমস্ত অপারেশন বিভক্ত বা বিভ্রান্ত হয় না, অর্থাৎ প্রতিটি অপারেশন সম্পূর্ণ বা একেবারেই হয় না।

AtomicInteger কনস্ট্রাকশন

AtomicInteger তৈরি করার জন্য নিচের কনস্ট্রাকটর ব্যবহার করা হয়:

AtomicInteger atomicInteger = new AtomicInteger(); // ডিফল্ট মান 0
AtomicInteger atomicIntegerWithInitialValue = new AtomicInteger(10); // প্রাথমিক মান 10

AtomicInteger এর প্রধান মেথডসমূহ

  1. get():
    বর্তমান মান রিটার্ন করে।

    int value = atomicInteger.get();
    
  2. set(int newValue):
    একটি নতুন মান সেট করে।

    atomicInteger.set(20);
    
  3. getAndIncrement():
    বর্তমান মান রিটার্ন করে এবং ১ যোগ করে।

    int value = atomicInteger.getAndIncrement(); // রিটার্ন: পুরানো মান
    
  4. incrementAndGet():
    ১ যোগ করে এবং নতুন মান রিটার্ন করে।

    int value = atomicInteger.incrementAndGet(); // রিটার্ন: নতুন মান
    
  5. compareAndSet(int expectedValue, int newValue):
    যদি বর্তমান মান expectedValue এর সমান হয়, তবে এটি newValue এ পরিবর্তিত হয়।

    boolean success = atomicInteger.compareAndSet(10, 15);
    
  6. addAndGet(int delta):
    নির্দিষ্ট মান যোগ করে এবং নতুন মান রিটার্ন করে।

    int value = atomicInteger.addAndGet(5); // রিটার্ন: নতুন মান
    
  7. getAndAdd(int delta):
    নির্দিষ্ট মান যোগ করার আগে বর্তমান মান রিটার্ন করে।

    int value = atomicInteger.getAndAdd(3); // রিটার্ন: পুরানো মান
    

AtomicInteger উদাহরণ

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(10);

        // Get the current value
        System.out.println("Initial Value: " + atomicInteger.get());

        // Increment the value
        System.out.println("After Increment: " + atomicInteger.incrementAndGet());

        // Add 5 and get the new value
        System.out.println("After Adding 5: " + atomicInteger.addAndGet(5));

        // Compare and set
        boolean isUpdated = atomicInteger.compareAndSet(16, 20);
        System.out.println("Compare and Set Success: " + isUpdated);
        System.out.println("Final Value: " + atomicInteger.get());
    }
}

আউটপুট:

Initial Value: 10  
After Increment: 11  
After Adding 5: 16  
Compare and Set Success: true  
Final Value: 20  

JavaScript-এর Atomics এবং Java-এর AtomicInteger এর মধ্যে পার্থক্য

বৈশিষ্ট্যAtomics (JavaScript)AtomicInteger (Java)
ব্যবহার ক্ষেত্রSharedArrayBuffer এর ডেটা ম্যানেজমেন্ট।মাল্টি-থ্রেডেড প্রোগ্রামে atomic integers
লক প্রয়োজনলক-মুক্ত synchronization।লক-মুক্ত synchronization।
ডেটা টাইপTyped Arrays (ইনটিজার, ফ্লোট ইত্যাদি)।শুধুমাত্র integer।
অপারেশন সমর্থনadd, sub, or, and, load, store, ইত্যাদি।get, set, incrementAndGet, ইত্যাদি।

সারসংক্ষেপ

  • AtomicInteger জাভা মাল্টি-থ্রেডিংয়ে atomic operations পরিচালনা করার জন্য একটি অত্যন্ত গুরুত্বপূর্ণ ক্লাস।
  • এটি থ্রেড-সেফ এবং লক-মুক্ত synchronization নিশ্চিত করে।
  • JavaScript-এর Atomics API একই কাজ করে, তবে এটি শুধুমাত্র SharedArrayBuffer এবং typed arrays এর উপর কাজ করে।
  • মাল্টি-থ্রেডিংয়ে ডেটা সঠিকতা বজায় রাখতে এবং পারফরম্যান্স বাড়াতে AtomicInteger এবং Atomics উভয়ই গুরুত্বপূর্ণ।
Content added By

Introduction

301

AtomicInteger হল Java এর java.util.concurrent.atomic প্যাকেজের একটি ক্লাস, যা atomic operations সাপোর্ট করে। এটি মাল্টি-থ্রেডেড পরিবেশে integer values পরিচালনা করার জন্য ব্যবহৃত হয়, যেখানে একাধিক থ্রেড একই ডেটার উপর কাজ করছে। AtomicInteger এর মাধ্যমে ডেটা সঠিকতা (consistency) নিশ্চিত করা হয়, এবং এটি thread-safe


AtomicInteger এর বৈশিষ্ট্য

  • Atomicity: প্রতিটি অপারেশন সম্পূর্ণভাবে "atomic", অর্থাৎ এটি বিভক্ত হয় না।
  • Thread-Safety: একাধিক থ্রেড একই সময়ে ডেটার উপর কাজ করলেও এটি সঠিকভাবে পরিচালিত হয়।
  • Lock-Free Mechanism: লক ব্যবহার না করেই ডেটা হস্তান্তর করা হয়, যা পারফরম্যান্স বাড়ায়।
  • Non-blocking Operations: থ্রেডগুলো ব্লক না হয়েও ডেটা আপডেট করতে পারে।

AtomicInteger কেন প্রয়োজন?

১. Race Condition এড়ানো

মাল্টি-থ্রেডেড পরিবেশে একাধিক থ্রেড যখন একটি সাধারণ integer ভেরিয়েবল ব্যবহার করে, তখন Race Condition হতে পারে। AtomicInteger এই সমস্যা প্রতিরোধ করে।

২. Thread-Safe Increment/Decrement

int বা long ডেটা টাইপের ভেরিয়েবল ম্যানিপুলেশনের সময় সিঙ্ক্রোনাইজেশন প্রয়োজন হয়। কিন্তু AtomicInteger এই অপারেশনগুলো synchronized blocks ছাড়াই নিরাপদে সম্পন্ন করতে পারে।

৩. Performance Optimization

AtomicInteger লক-মুক্ত পদ্ধতি ব্যবহার করে কাজ করায় এটি অনেক দ্রুত কাজ সম্পন্ন করতে পারে।


AtomicInteger ক্লাসের সাধারণ মেথডসমূহ

  • get()
    বর্তমান মান রিটার্ন করে।
  • set(int newValue)
    নতুন মান সেট করে।
  • getAndSet(int newValue)
    পুরোনো মান রিটার্ন করে এবং নতুন মান সেট করে।
  • incrementAndGet()
    মান ১ দ্বারা বৃদ্ধি করে এবং নতুন মান রিটার্ন করে।
  • getAndIncrement()
    বর্তমান মান রিটার্ন করে এবং পরে ১ দ্বারা বৃদ্ধি করে।
  • decrementAndGet()
    মান ১ দ্বারা কমায় এবং নতুন মান রিটার্ন করে।
  • getAndDecrement()
    বর্তমান মান রিটার্ন করে এবং পরে ১ দ্বারা কমায়।
  • addAndGet(int delta)
    নির্দিষ্ট মান যোগ করে এবং নতুন মান রিটার্ন করে।
  • compareAndSet(int expect, int update)
    যদি বর্তমান মান expect এর সমান হয়, তবে এটি update দ্বারা প্রতিস্থাপিত হয়।

উদাহরণ: AtomicInteger ব্যবহার

মাল্টি-থ্রেডিংয়ে সাধারণ integer ভেরিয়েবল ব্যবহার করলে Race Condition

public class RaceConditionExample {
    private static int counter = 0;

    public static void main(String[] args) {
        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                counter++; // Race Condition হতে পারে
            }
        };

        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final Counter Value: " + counter); // সঠিক মান নাও আসতে পারে
    }
}

AtomicInteger দিয়ে Race Condition সমাধান

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicExample {
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {
        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                counter.incrementAndGet(); // Thread-safe increment
            }
        };

        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final Counter Value: " + counter.get()); // সঠিক মান
    }
}

AtomicInteger ব্যবহার করার সুবিধা

  • Thread Safety: কোনো সিঙ্ক্রোনাইজেশন প্রয়োজন হয় না।
  • High Performance: লক-মুক্ত (lock-free) অপারেশন দ্বারা দ্রুত কাজ সম্পন্ন হয়।
  • Concurrency Control: একাধিক থ্রেডের মধ্যে ডেটার সঠিকতা নিশ্চিত করে।
  • Flexibility: বিভিন্ন মেথডের মাধ্যমে ডেটা ম্যানিপুলেশন সহজ হয়।

AtomicInteger এবং Synchronized এর তুলনা

ফিচারAtomicIntegerSynchronized
Thread Safetyনিশ্চিতনিশ্চিত
Performanceউচ্চ, কারণ লক-মুক্ততুলনামূলক ধীর, কারণ লক ব্যবহৃত হয়
Complexityসহজ এবং ব্যবহারযোগ্যকোড জটিল হতে পারে
Usage Scopeশুধুমাত্র integer বা numeric ডেটার জন্যসব ধরনের ডেটার জন্য

AtomicInteger হল মাল্টি-থ্রেডিং পরিবেশে integer ভেরিয়েবল পরিচালনার জন্য একটি কার্যকর পদ্ধতি। এটি লক-মুক্ত, দ্রুত এবং সহজে ব্যবহারযোগ্য, যা ডেটার সঠিকতা এবং পারফরম্যান্স নিশ্চিত করে।

Content added By

Methods: get(), set(), getAndIncrement(), incrementAndGet(), compareAndSet(), ইত্যাদি

328

Atomics API JavaScript-এ থ্রেড-সেফ অপারেশন করার জন্য বিভিন্ন methods প্রদান করে, যা SharedArrayBuffer এবং typed arrays-এ কাজ করে। Atomics এর এই মেথডগুলো atomic (অখণ্ড) অপারেশন পরিচালনা করতে ব্যবহৃত হয়। এখানে গুরুত্বপূর্ণ কিছু মেথডের বিস্তারিত আলোচনা করা হলো।


Atomics এর গুরুত্বপূর্ণ মেথডসমূহ

১. Atomics.get(typedArray, index)

  • নির্দিষ্ট index থেকে একটি ডেটা রিড করে।
  • এটি থ্রেড-সেফভাবে কাজ করে, অর্থাৎ, কোনো থ্রেড এর মান পরিবর্তন করার আগে এটি ডেটা রিড করতে পারে।

উদাহরণ:

const buffer = new SharedArrayBuffer(16);
const typedArray = new Int32Array(buffer);

typedArray[0] = 42;
const value = Atomics.get(typedArray, 0); // ডেটা রিড
console.log(value); // আউটপুট: 42

২. Atomics.set(typedArray, index, value)

  • নির্দিষ্ট index এ একটি মান সেট করে।
  • এটি থ্রেড-সেফ পদ্ধতিতে ডেটা আপডেট করতে ব্যবহৃত হয়।

উদাহরণ:

const buffer = new SharedArrayBuffer(16);
const typedArray = new Int32Array(buffer);

Atomics.set(typedArray, 0, 100); // ডেটা সেট
console.log(typedArray[0]); // আউটপুট: 100

৩. Atomics.add(typedArray, index, value)

  • নির্দিষ্ট index এ একটি মান যোগ করে এবং পুরানো মানটি রিটার্ন করে।
  • এটি সাধারণত increment বা accumulation করার জন্য ব্যবহৃত হয়।

উদাহরণ:

const buffer = new SharedArrayBuffer(16);
const typedArray = new Int32Array(buffer);

Atomics.set(typedArray, 0, 10); // প্রাথমিক মান
const oldValue = Atomics.add(typedArray, 0, 5); // 5 যোগ করা
console.log(oldValue); // আউটপুট: 10
console.log(typedArray[0]); // আউটপুট: 15

৪. Atomics.sub(typedArray, index, value)

  • নির্দিষ্ট index থেকে একটি মান বিয়োগ করে এবং পুরানো মানটি রিটার্ন করে।
  • এটি decrement করার জন্য ব্যবহার করা হয়।

উদাহরণ:

const buffer = new SharedArrayBuffer(16);
const typedArray = new Int32Array(buffer);

Atomics.set(typedArray, 0, 20);
const oldValue = Atomics.sub(typedArray, 0, 5); // 5 বিয়োগ করা
console.log(oldValue); // আউটপুট: 20
console.log(typedArray[0]); // আউটপুট: 15

৫. Atomics.increment(typedArray, index)

  • নির্দিষ্ট index এ মান ১ দ্বারা বৃদ্ধি করে এবং পুরানো মানটি রিটার্ন করে।
  • এটি মূলত একটি বিশেষায়িত add() অপারেশন।

উদাহরণ:

const buffer = new SharedArrayBuffer(16);
const typedArray = new Int32Array(buffer);

Atomics.set(typedArray, 0, 5);
const oldValue = Atomics.add(typedArray, 0, 1); // increment
console.log(oldValue); // আউটপুট: 5
console.log(typedArray[0]); // আউটপুট: 6

৬. Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)

  • যদি নির্দিষ্ট index এর মান expectedValue এর সমান হয়, তবে এটি replacementValue দিয়ে আপডেট করে।
  • এটি conditional update করতে ব্যবহৃত হয়।

উদাহরণ:

const buffer = new SharedArrayBuffer(16);
const typedArray = new Int32Array(buffer);

Atomics.set(typedArray, 0, 10);

const oldValue = Atomics.compareExchange(typedArray, 0, 10, 20);
console.log(oldValue); // আউটপুট: 10
console.log(typedArray[0]); // আউটপুট: 20

৭. Atomics.exchange(typedArray, index, value)

  • নির্দিষ্ট index এর পুরানো মানটি রিটার্ন করে এবং নতুন মান দিয়ে আপডেট করে।
  • এটি ডেটা প্রতিস্থাপনের জন্য ব্যবহার করা হয়।

উদাহরণ:

const buffer = new SharedArrayBuffer(16);
const typedArray = new Int32Array(buffer);

Atomics.set(typedArray, 0, 50);

const oldValue = Atomics.exchange(typedArray, 0, 100);
console.log(oldValue); // আউটপুট: 50
console.log(typedArray[0]); // আউটপুট: 100

৮. Atomics.wait(typedArray, index, value, timeout)

  • একটি থ্রেডকে অপেক্ষা করায় যতক্ষণ না নির্দিষ্ট index এর মান পরিবর্তিত হয় বা একটি নির্দিষ্ট সময় পেরিয়ে যায়।
  • এটি synchronization এর জন্য গুরুত্বপূর্ণ।

উদাহরণ:

const buffer = new SharedArrayBuffer(16);
const typedArray = new Int32Array(buffer);

Atomics.set(typedArray, 0, 0);

setTimeout(() => {
    Atomics.store(typedArray, 0, 1);
    Atomics.notify(typedArray, 0); // অপেক্ষা করা থ্রেডকে জাগানো
}, 1000);

Atomics.wait(typedArray, 0, 0); // থ্রেড অপেক্ষা করবে যতক্ষণ না মান পরিবর্তন হয়
console.log("Value updated!");

৯. Atomics.notify(typedArray, index, count)

  • একটি বা একাধিক থ্রেডকে জাগিয়ে তোলে, যারা wait() অবস্থায় রয়েছে।

উপসংহার

Atomics API-র এই মেথডগুলো multithreaded programming-এ shared memory ব্যবস্থাপনার জন্য অপরিহার্য। এগুলো thread-safe operations, synchronization, এবং data consistency নিশ্চিত করতে ব্যবহার করা হয়। বিশেষ করে, add(), compareExchange(), এবং wait() মেথডগুলো মাল্টি-থ্রেডিংয়ে খুব কার্যকর।

Content added By
Promotion

Are you sure to start over?

Loading...